﻿using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Xml;
using BrasilFramework.Comum.Utilitario;

namespace BrasilFramework.Comum.XML
{
    public class Gerador
    {
        public static XmlDocument GerarListaPropriedade<T>(IEnumerable<T> lista, string nomePropriedade, string nomeElemento, string nomeNo, string nomeAtributo)
        {
            XmlDocument documento = new XmlDocument();

            if (lista == null || lista.Count() == 0) return documento;

            XmlElement elemento = documento.CreateElement(nomeElemento);
            documento.AppendChild(elemento);

            XmlNode no;
            PropertyInfo informacaoPropriedade = typeof(T).GetProperty(nomePropriedade);

            List<object> listaFiltrada = lista.Select(item => informacaoPropriedade.GetValue(item, null)).Distinct().ToList();

            foreach (object item in listaFiltrada)
            {
                no = documento.CreateElement(nomeNo);
                XmlAttribute atributo = documento.CreateAttribute(nomeAtributo);
                atributo.Value = item.ToString();
                if (no.Attributes != null) no.Attributes.Append(atributo);
                elemento.AppendChild(no);
            }

            return documento;
        }

        public static XmlDocument GerarListaPropriedade<T>(IEnumerable<T> lista, string nomeElemento, string nomeNo, Dictionary<string, string> listaPropriedadeAtributo)
        {
            XmlDocument documento = new XmlDocument();

            if (lista == null || lista.Count() == 0) return documento;

            XmlElement elemento = documento.CreateElement(nomeElemento);
            documento.AppendChild(elemento);

            XmlNode no;

            foreach (object item in lista)
            {
                no = documento.CreateElement(nomeNo);

                foreach (KeyValuePair<string, string> propriedadeAtributo in listaPropriedadeAtributo)
                {
                    XmlAttribute atributo = documento.CreateAttribute(propriedadeAtributo.Value);
                    atributo.Value = ConverterValorTexto(Objeto.LerValor(item, propriedadeAtributo.Key));
                    if (no.Attributes != null) no.Attributes.Append(atributo);
                }

                elemento.AppendChild(no);
            }

            return documento;
        }

        private static string ConverterValorTexto(object valor)
        {
            if(valor == null) return null;

            decimal valorNumerico;

            string valorRetorno = decimal.TryParse(valor.ToString(), out valorNumerico) ? valor.ToString().Replace(".", "").Replace(",", ".") : valor.ToString();

            return valorRetorno;
        }

        public static XmlDocument GerarListaIdentificador<T>(IEnumerable<T> lista)
        {
            return GerarListaIdentificador(lista, "Identificador");
        }

        public static XmlDocument GerarListaIdentificador<T>(IEnumerable<T> lista, string nomePropriedade)
        {
            return GerarListaPropriedade(lista, nomePropriedade, "Lista", "Item", "Identificador");
        }

    }
}
